class Solution {
public:
    /**
     * 
     * @param arr int整型vector the array
     * @return int整型
     */
    int maxLength(vector<int>& arr) {
        // write code here
       /*
        1、双指针的移动策略
          end每次遍历都往后移动一个
          start是发现重复项就跳着移动，跳到重复项的后面一个元素
          start-end+1就是无重复的个数
         2、哈希表 key存元素值 value存下标
         把遍历到的元素都往里面扔
        */
        unordered_map<int, int>map; //(元素本身,下标)
        int start=0;
        int end=0;
        int maxlen=1;
        while(end<arr.size())
        {
            auto tmp=map.find(arr[end]);
            if(tmp==map.end()||tmp->second<start) //容器里面没有
            {
                maxlen=max(maxlen,end-start+1);
            }
            else
            {
                start=tmp->second+1;
            }
            map[arr[end]]=end;
            end++;
        }
        return maxlen;
    }
};